﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using EntitiesLayer;
using System.Collections;
using System.Transactions;
using System.Data.SqlClient;
using System.Data;

namespace DAL.Repositories
{
    public class ContactoReferenciaRepository : IRepository<ContactoReferencia>
    {
        private List<ContactoReferencia> insertItems;
        private List<ContactoReferencia> deleteItems;
        private List<ContactoReferencia> updateItems;

        public ContactoReferenciaRepository()
        {
            insertItems = new List<ContactoReferencia>();
            deleteItems = new List<ContactoReferencia>();
            updateItems = new List<ContactoReferencia>();
        }

        public void Insert(ContactoReferencia entity)
        {
            insertItems.Add(entity);
        }

        public void Update(ContactoReferencia entity)
        {
            updateItems.Add(entity);
        }

        public void Save()
        {
            using (TransactionScope scope = new TransactionScope())
            {
                try
                {
                    if (insertItems.Count > 0)
                    {
                        foreach (ContactoReferencia contacto in insertItems)
                        {
                            InsertContactoReferencia(contacto);
                        }
                    }

                    if (updateItems.Count > 0)
                    {
                        foreach (ContactoReferencia contacto in updateItems)
                        {
                            //UpdateUsuario(contacto);
                        }
                    }
                    scope.Complete();
                }
                catch (TransactionAbortedException ex)
                {

                }
                catch (ApplicationException ex)
                {

                }
                finally
                {
                    Clear();
                }
            }
        }

        public void Clear()
        {
            insertItems.Clear();
            updateItems.Clear();
        }

        public void InsertContactoReferencia(ContactoReferencia contacto)
        {
            try
            {
                SqlCommand cmd = new SqlCommand();
                DataSet ds;
                cmd.Parameters.Add(new SqlParameter("@primerNombre", contacto.PrimerNombre));
                cmd.Parameters.Add(new SqlParameter("@segundoNombre", contacto.SegundoNombre));
                cmd.Parameters.Add(new SqlParameter("@primerApellido", contacto.PrimerApellido));
                cmd.Parameters.Add(new SqlParameter("@segundoApellido", contacto.SegundoApellido));
                cmd.Parameters.Add(new SqlParameter("@telefono", contacto.Telefono));
                cmd.Parameters.Add(new SqlParameter("@celular", contacto.Celular));


                if (contacto.IdUsuario != 0)
                {
                    cmd.Parameters.Add(new SqlParameter("@idUsuario", contacto.IdUsuario));
                    ds = DBAccess.ExecuteSPWithDS(ref cmd, "pa_agregar_segunda_referencia");
                }
                else
                {
                    ds = DBAccess.ExecuteSPWithDS(ref cmd, "pa_agregar_referencia");
                }
            }
            catch (Exception ex)
            {

            }
        }


        #region "Metodos NO implementados"
        public void Delete(ContactoReferencia entity)
        {

        }

        public ContactoReferencia GetById(int pid)
        {
            return null;
        }

        public IEnumerable<ContactoReferencia> GetAll(int pid)
        {
            List<ContactoReferencia> listaContactos = null;

            SqlCommand cmd = new SqlCommand();
            cmd.Parameters.Add(new SqlParameter("@idUsuario", pid));
            DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "pa_consultar_referencias");

            if (ds.Tables[0].Rows.Count > 0)
            {
                listaContactos = new List<ContactoReferencia>();

                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    listaContactos.Add(new ContactoReferencia
                    {
                        Id = Convert.ToInt32(dr["id"]),
                        PrimerNombre = dr["primer_nombre"].ToString(),
                        SegundoNombre = dr["segundo_nombre"].ToString(),
                        PrimerApellido = dr["primer_apellido"].ToString(),
                        SegundoApellido = dr["segundo_apellido"].ToString(),
                        Telefono = dr["telefono"].ToString(),
                        Celular = dr["celular"].ToString()
                    });
                }
            }
            return listaContactos;
        }
        public IEnumerable<ContactoReferencia> GetAll()
        {
            List<ContactoReferencia> listaContactos = null;

            SqlCommand cmd = new SqlCommand();
            DataSet ds = DBAccess.ExecuteSPWithDS(ref cmd, "pa_consultar_contactos");

            if (ds.Tables[0].Rows.Count > 0)
            {
                listaContactos = new List<ContactoReferencia>();

                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    listaContactos.Add(new ContactoReferencia
                    {
                        Id = Convert.ToInt32(dr["id"]),
                        PrimerNombre = dr["primer_nombre"].ToString(),
                        SegundoNombre = dr["segundo_nombre"].ToString(),
                        PrimerApellido = dr["primer_apellido"].ToString(),
                        SegundoApellido = dr["segundo_apellido"].ToString(),
                        Telefono = dr["telefono"].ToString(),
                        Celular = dr["celular"].ToString()
                    });
                }
            }
            return listaContactos;
        }
        public IEnumerable<Rol> GetUsuarios(int ptipo)
        {
            return null;
        }
    }
        #endregion

}
